// 创建文件
import { existsSync, mkdirSync, writeFileSync, readdirSync, statSync, readFileSync, appendFileSync } from "fs";
import { join } from "path";
import { log } from "./utils.js";

/*
* fs文件操作
* */
export class FsFile {
  root; // 根路径

  constructor(root) {
    if (!root) return log.error("错误：请提供根路径。");
    this.root = root;
  }

  /*
  * 路径拼接
  * @param {string} ...paths 路径
  * @return {string} path 拼接后的路径
  * */
  join(...paths) {
    const pRoot = this.root.replace(/\//g, "\\");
    return (paths[0].includes(this.root) || paths[0].includes(pRoot)) ? join(...paths) : join(this.root, ...paths);
  }

  /*
  * 是否存在
  * @param {string} path 路径
  * @return {boolean} 是否存在
  * */
  isExists(path) {
    return existsSync(path);
  }

  /*
  * 获取路径下的所有文件夹名称
  * @param {string} folderName 文件夹名称
  * @return {string} folderPath 文件夹路径
  * */
  getFolderNames(path) {
    return new Promise((resolve, reject) => {
      path = path || this.root;
      const folderNames = [];
      if (this.isExists(path)) {
        const files = readdirSync(path);
        files.forEach(file => {
          const filePath = this.join(path, file);
          if (this.isExists(filePath) && statSync(filePath).isDirectory()) {
            folderNames.push(file);
          }
        });
        resolve(folderNames);
      } else {
        log.error(`错误：路径 "${path}" 不存在。`);
        reject(false);
      }
    });
  }

  /*
  * 获取文件内容
  * */
  getFileContent(filePath) {
    if (!filePath) {
      log.error("错误：请提供文件路径。");
      return false;
    }
    return readFileSync(filePath, "utf8");
  }

  /*
  * 创建文件夹
  * @param {string} folderName 文件夹名称
  * @return {string} folderPath 文件夹路径
  * */
  createFolder(folderPath, options = { recursive: true }) {
    if (!folderPath) {
      log.error("错误：请提供文件夹名称。");
      return false;
    }
    // 创建文件夹路径
    mkdirSync(folderPath, options);
    log.done(`文件夹 "${folderPath}" 创建成功。`);
    return folderPath;
  }

  /*
  * 创建文件
  * @param {string} filePath 文件路径
  * @param {string} content 文件内容
  * */
  createFile(filePath, content = "", options = "utf8") {
    if (!filePath) {
      log.error("错误：请提供文件名称。");
      return false;
    }
    // 创建文件并写入内容
    writeFileSync(filePath, content, options);
    log.done(`文件 "${filePath}" 创建成功。`);
    return filePath;
  }

  /*
  * 追加文件内容
  * */
  appendFile(filePath, content = "", options = "utf8") {
    if (!filePath) {
      log.error("错误：请提供文件名称。");
      return false;
    }
    // 创建文件并写入内容
    appendFileSync(filePath, content, options);
    log.done(`文件 "${filePath}" 追加成功。`);
    return filePath;
  }

}
